package com.juc;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

// 三种创建线程的方式

/**
 * NEW 初始化状态 未调用start
 * RUNNABLE 运行状态 运行中
 * BLOCKED 阻塞状态 表示线程阻塞于锁
 * WAITING 等待状态   wait join导致
 * TIME_WAITING 超时等待状态 可指定时间
 * TERMINATED 终止状态
 */

// 推荐Runnable 没继承限制
// 调用run 同步，调用start开启新的线程异步，run无限次  start仅一次执行(未完成前)
public class MyRunnable extends Thread {
    @Override
    public void run() {
        // 线程执行业务代码
        System.out.println("线程Thread继承");
    }
}

class Mythread extends Thread {
    @Override
    public void run() {
        System.out.println("线程Thread");
    }
}


// 多种写法
class MyToB {
    public static void main(String[] args) throws InterruptedException {
        // 通过继承Thread接口
        Mythread t1 = new Mythread();
        t1.start();

        // 通过实现Runnable接口
        Thread t2 = new Thread(new MyRunnable());
        t2.start();

        // 简写匿名类
        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
//                while (true) {
                    System.out.println("run runnable");
//                }
            }
        });
        t3.start();

        // 简写t3 FunctionalInterface接口
        Thread t5 = new Thread(()-> {
            System.out.println("run thread");
        });

        // 简写Thread
        Thread t4 = new Thread() {
            @Override
            public void run() {

                // 睡眠
                try {
                    Thread.sleep(1000);
                    // 推荐 按单位睡眠
                    TimeUnit.DAYS.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                // 当前线程
                System.out.println(Thread.currentThread().getName());
                System.out.println("run runnable");
            }
        };
        // 设置线程名称
        t4.setName("chao");
        t4.start();
        // 等待线程 类似async 执行完成 让主线程接手
        t4.join();
        // 存活状态(是否执行完)
        t4.isAlive();




        // 创建callable
        FutureTask<String> fut = new FutureTask<String>(()-> {
            System.out.println("run FutureTask");
            return "string";
        });
        new Thread(fut).start();

        // fut.get 默认等待线程结束
        try {
            System.out.println(fut.get());
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }


    }

}

